/*
	status: 该指针用于存放子进程的结束状态字
	option:	用于指定进程所做的操作,
	pid: 用于指定所等待的进程.

	pid:
		pid>0	等待进程ID为pid所指定值的子进程
		pid=0	等待进程组ID等于发出调用进程的进程组ID的子进程
		pid=-1	等待所有子进程,等价于wait调用
		pid<-1	等待进程组ID为pid的绝对值的子进程

	option:
		0					将进程挂起等待其结束
		WIFEXITED(status)	进程真正结束，返回值为真
*/

/* int wait(int *status)*/
/* int waitpid(pid_t pid, int * status, int option) */
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include "error.h"

void h_exit(int status);

int main(int argc, char * argv[]) {
	pid_t pid;
	int status;
	if((pid = fork()) < 0) {
		err_sys("Fork error.");
	} else if (pid == 0) {
		exit(7);
	}
	if(wait(&status) != pid) 
		err_sys("wait error.");
	h_exit(status);

	if((pid = fork()) < 0)
		err_sys("fork error.");
	else if(pid == 0)
		exit(1);
	if(wait(&status) != pid)
		err_sys("wait error !");
	h_exit(status);

	if((pid = fork()) < 0)
		err_sys("fork error");
	else if(pid == 0)
		exit(2);
	if(wait(&status) != pid)
		err_sys("wait error !");
	h_exit(status);

	return 0;
}

void h_exit(int status) {
	if(WIFEXITED(status))
		fprintf(stdout, "Normal termination, exit status=%d.\n", WEXITSTATUS(status));
	else if(WIFSIGNALED(status))
		fprintf(stdout, "Abnormal termination, exit status=%d.\n", WTERMSIG(status));
}
